package com.example.havi.ui.voiceRecorder;

import android.content.Context;
import android.media.MediaRecorder;
import android.os.Handler;
import android.os.SystemClock;
import android.text.format.Time;


import java.io.File;
import java.util.Date;
import java.util.UUID;

public class EaseVoiceRecorder {
    MediaRecorder recorder;

    static final String PREFIX = "voice";
    static final String EXTENSION = ".amr";

    private boolean isRecording = false;
    private long startTime;
    private String voiceFilePath = null;
    private String voiceFileName = null;
    private File file;
    private Handler handler;

    public EaseVoiceRecorder(Handler handler) {
        this.handler = handler;
    }

    /**
     * start recording to the file
     */
    public String startRecording(Context appContext) {
        file = null;
//        try {
//            // need to create recorder every time, otherwise, will got exception
//            // from setOutputFile when try to reuse
//            if (recorder != null) {
//                recorder.release();
//                recorder = null;
//            }
//            recorder = new MediaRecorder();
//            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//            recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
//            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//            recorder.setAudioChannels(1); // MONO
//            recorder.setAudioSamplingRate(8000); // 8000Hz
//            recorder.setAudioEncodingBitRate(64); // seems if change this to
//            // 128, still got same file
//            // size.
//            // one easy way is to use temp file
//            // file = File.createTempFile(PREFIX + userId, EXTENSION,
//            // User.getVoicePath());
//            voiceFileName = getVoiceFileName(UUID.randomUUID().toString());
//            voiceFilePath = PathUtil.getInstance().getVoicePath() + "/" + voiceFileName;
//            File dirFile = new File(PathUtil.getInstance().getVoicePath().toString()) ;
//            file = new File(voiceFilePath);
//
//            if(!dirFile.exists()) {
//                dirFile.mkdirs() ;
//            }
//
//            if(!file.exists()) {
//                file.createNewFile() ;
//            }
//            recorder.setOutputFile(file.getAbsolutePath());
//            recorder.prepare();
//            isRecording = true;
//            recorder.start();
//        } catch (Exception e) {
//            e.printStackTrace();
////            LogCatUtil.e("frank","录音开始异常:"+e.getMessage());
//        }
//        startTime = new Date().getTime();
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                try {
//                    while (isRecording) {
//                        int seconds = (int) (new Date().getTime() - startTime) / 1000;
//                        android.os.Message msg = new android.os.Message();
//                        msg.what = recorder.getMaxAmplitude() * 13 / 0x7FFF;
//                        msg.arg1=seconds;//新增加传递参数
//                        handler.sendMessage(msg);
//                        SystemClock.sleep(100);
//                    }
//                } catch (Exception e) {
//                    e.printStackTrace();
////                    LogCatUtil.e("frank","录音开始异常11:"+e.getMessage());
//
//                    // from the crash report website, found one NPE crash from
//                    // one android 4.0.4 htc phone
//                    // maybe handler is null for some reason
//
//                }
//            }
//        }).start();


        return file == null ? null : file.getAbsolutePath();
    }

    /**
     * stop the recoding
     *
     * @return seconds of the voice recorded
     */

    public void discardRecording() {
        if (recorder != null) {
            try {
                recorder.stop();
                recorder.release();
                recorder = null;
                if (file != null && file.exists() && !file.isDirectory()) {
                    file.delete();
                }
            } catch (IllegalStateException e) {
            } catch (RuntimeException e){}
            isRecording = false;
        }
    }

    public int stopRecoding() {
//        if(recorder != null){
//            isRecording = false;
//            recorder.stop();
//            recorder.release();
//            recorder = null;
//
//            if(file == null || !file.exists() || !file.isFile()){
//                return EMError.FILE_INVALID;
//            }
//            if (file.length() == 0) {
//                file.delete();
//                return EMError.FILE_INVALID;
//            }
//            int seconds = (int) (new Date().getTime() - startTime) / 1000;
//            EMLog.d("voice", "voice recording finished. seconds:" + seconds + " file length:" + file.length());
//            return seconds;
//        }
        return 0;
    }

    protected void finalize() throws Throwable {
        super.finalize();
        if (recorder != null) {
            recorder.release();
        }
    }

    private String getVoiceFileName(String uid) {
        Time now = new Time();
        now.setToNow();
        return uid + now.toString().substring(0, 15) + EXTENSION;
    }

    public boolean isRecording() {
        return isRecording;
    }


    public String getVoiceFilePath() {
        return voiceFilePath;
    }

    public String getVoiceFileName() {
        return voiceFileName;
    }
}
